package com.binc.testspring.common.lamada;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.apache.poi.ss.formula.functions.T;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 多级分组
 */
public class StreamCollect {



        public static void main(String[] args) {
            Stream<Student> studentStream = Stream.of(
                    new Student("赵丽颖", 52, 95),
                    new Student("杨颖", 56, 88),
                    new Student("迪丽热巴", 56, 55),
                    new Student("柳岩", 52, 33)
            );

            //多级分组
            //1.先根据年龄分组,然后再根据成绩分组
            //分析:第一个Collectors.groupingBy() 使用的是(年龄+成绩)两个维度分组,所以使用两个参数 groupingBy()方法
            //    第二个Collectors.groupingBy() 就是用成绩分组,使用一个参数 groupingBy() 方法
            Map<Integer, Map<Integer, Map<String, List<Student>>>> map =
                    studentStream.collect(Collectors.groupingBy(
                            str -> str.getAge(), // 这里优先按照年龄分组
                            Collectors.groupingBy(str -> str.getScore(),  //  然后将结果按照分数分组
                                    Collectors.groupingBy((student) -> {
                                        if (student.getScore() >= 60) { //分数分组的具体规则
                                            return "及格";
                                        } else {
                                            return "不及格";
                                        }
                                    }))
                            )
                    );

            map.forEach((key,value)->{
                System.out.println("年龄:" + key);
                value.forEach((k2,v2)->{
                    System.out.println("\t" + v2);
                });
            });
        }

    // 年龄:52
    // {不及格=[Student{name='柳岩', age=52, score=33}]}
    // {及格=[Student{name='赵丽颖', age=52, score=95}]}
    // 年龄:56
    // {不及格=[Student{name='迪丽热巴', age=56, score=55}]}
    // {及格=[Student{name='杨颖', age=56, score=88}]}

}


@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
  class Student {

    private String name;

    private int age;

    private int score;


}
